<template>
  <div class="login">
    <div class="login_box">
      <!-- 头像区域 -->
      <div class="avatar">
        <img src="../assets/logo.png" />
      </div>
      <!-- 表单区域 -->
      <!-- 注意：想要使用某个elementUI的组件 就要现在element.js中按需导入
      导入的名字就是标签上把el-去掉之后 -->
      <el-form ref="loginFormRef" :rules="login_rules" class="login_form" :model="form">
        <!-- 用户名 -->
        <el-form-item prop="username">
          <el-input v-model="form.username" prefix-icon="iconfont icon-users"></el-input>
        </el-form-item>
        <!-- 密码 -->
        <el-form-item prop="password">
          <el-input v-model="form.password" prefix-icon="iconfont icon-3702mima"></el-input>
        </el-form-item>
        <el-form-item style="float: right">
          <el-button type="primary" @click="login">登录</el-button>
          <el-button type="info" @click="resetForm">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { log } from "util";
export default {
  data() {
    return {
      form: {
        username: "admin",
        password: "123456"
      },
      login_rules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
          { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }
        ],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          { min: 6, max: 8, message: "长度在 6 到 8 个字符", trigger: "blur" }
        ]
      }
    };
  },

  methods: {
    resetForm() {
      //this指向当前vue组件
      console.log(this);
      // 组件中有一个属性$refs是个对象 里面包含所有当前组件中注册过ref属性的所有子组件或DOM元素 
      //如果注册ref属性的是DOM元素 则键名是注册时自定义的名字 值就是所注册的DOM元素
      //如果注册该属性的是当前组件的一个子组件 则键值是组件本身 且其内部还含有$refs这个属性对象
      console.log(this.$refs);
      console.log(this.$refs.loginFormRef);
      // resetFields()方法为elementUI中提供的表单方法 因为该ref绑定的元素是elementUI的组件
      this.$refs.loginFormRef.resetFields();
    },

    login() {
      // 在点击登陆按钮之后 需要先校验成功才能调用登陆接口
      // 获取表单之后validate()方法校验 该方法的参数为一个回调函数 其参数为一个布尔值和一个未通过校验的字段 校验成功打印true 否则打印false
      this.$refs.loginFormRef.validate(async (flag,msg) => {
        // console.log(flag);
        if (flag) {
          console.log("校验成功");
          //校验成功 可以发送请求 先到main.js中导入axios并挂载
          //通过axios发送请求第二个参数为传递的参数对象  刚好data中的form是需要发送的参数
          //本来返回的是一个promise对象 然后通过调用.then(res){}得到响应结果，这里用async/await来修饰(在最近的函数前加async) 变成类似同步的操作 可直接返回一个对象，
          // 修饰后返回的对象里面的data才是我们需要的结果 可通过结构赋值得到我们想要的data
          const res = await this.axios.post('/login',this.form)
          console.log(res);
          if (res.meta.status == 200) {
            console.log('登录成功');   
            this.$message.success(res.meta.msg)
            //登录成功之后要保存token
            //调用window的API 存储res中返回的token
            window.sessionStorage.setItem('token',res.data.token)
            //页面跳转 用js的方法
            this.$router.push('/home')
          }else{
            console.log('登录失败');
            this.$message.error(res.meta.msg);
          }
          
        } else {
          console.log("校验失败");
          console.log(msg);//会打印出是哪一个字段出了问题
          
        }
      });
    }
  }
};
</script>

<style lang='less' scoped>
.login {
  width: 100%;
  height: 100%;
  background: url("../assets/bg.jpg") 100% 100%;
  .login_box {
    width: 450px;
    height: 300px;
    background-color: #fff;
    border-radius: 5px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    .avatar {
      width: 130px;
      height: 130px;
      padding: 10px;
      background-color: #fff;
      border: 1px solid #ccc;
      border-radius: 50%;
      box-shadow: 0 0 30px #04570a;
      position: absolute;
      overflow: hidden;
      left: 50%;
      transform: translate(-50%, -50%);
      img {
        width: 100%;
        height: 100%;
        border-radius: 50%;
        background-color: #b0b6b0;
      }
    }
    .login_form {
      position: absolute;
      bottom: 0;
      //设置了绝对定位之后  宽度就消失了
      width: 100%;
      box-sizing: border-box;
      //改变盒模型 使得设置padding值时挤小内容区域
      padding: 0 20px;
    }
  }
}
</style>
